package com.run2code.log.config;

import com.run2code.log.function.DefaultFunctionHandler;
import com.run2code.log.function.IFunctionService;
import com.run2code.log.handler.CustomFunctionFactory;
import com.run2code.log.handler.DefaultCustomFunctionHandler;
import com.run2code.log.handler.DefaultLogRecordHandler;
import com.run2code.log.handler.ICustomFunctionService;
import com.run2code.log.handler.ILogRecordService;
import com.run2code.log.parser.BizLogParser;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Role;

import java.util.List;

/**
 * 日志基础配置，这个类初始化了一些组件必须要用到的bean
 * <p>
 * 为什么要单独写一个配置类呢？
 * 1、以后可以引入业务日志组件的全局配置
 * 2、方便抽取成start
 * 关注公众号【奔跑的码畜】，一起进步不迷路
 *
 * @author 第七人格
 * @date 2023/10/13
 */
@Configuration
public class BizLogAutoConfiguration {

    /**
     * 自定义函数拓展点
     *
     * @return {@link ICustomFunctionService} 注入ICustomFunctionService
     */
    @Bean
    @ConditionalOnMissingBean(ICustomFunctionService.class)
    @Role(BeanDefinition.ROLE_APPLICATION)
    public ICustomFunctionService customFunction() {
        return new DefaultCustomFunctionHandler();
    }

    /**
     * 自定义函数工厂，项目启动时Spring会自动注入这些bean
     *
     * @param iCustomFunctionServiceList 实现了{@link ICustomFunctionService}的bean的集合
     * @return {@link CustomFunctionFactory} 注入CustomFunctionFactory
     */
    @Bean
    public CustomFunctionFactory CustomFunctionRegistrar(List<ICustomFunctionService> iCustomFunctionServiceList) {
        return new CustomFunctionFactory(iCustomFunctionServiceList);
    }

    /**
     * 自定义函数
     *
     * @param customFunctionFactory 自定义函数工厂
     * @return {@link IFunctionService} 注入IFunctionService
     */
    @Bean
    public IFunctionService customFunctionService(CustomFunctionFactory customFunctionFactory) {
        return new DefaultFunctionHandler(customFunctionFactory);
    }

    /**
     * 日志解析器
     *
     * @return {@link BizLogParser} 注入BizLogParser
     */
    @Bean
    public BizLogParser bizLogParser() {
        return new BizLogParser();
    }

    /**
     * 日志记录拓展点，如果需要拓展日志记录，可以实现该接口
     *
     * @return {@link ILogRecordService} 注入ILogRecordService
     */
    @Bean
    // 如果实现缺失才会走这里
    @ConditionalOnMissingBean(ILogRecordService.class)
    // 用户定义的Bean的优先级需要高于默认的Bean，所以这里需要加上这个注解
    @Role(BeanDefinition.ROLE_APPLICATION)
    public ILogRecordService recordService() {
        return new DefaultLogRecordHandler();
    }
}
